package lsl.leetCode.year2023.test0131;

import lsl.leetCode.test1222.ListNode;

/**
 * description:
 *
 * @author: liushengli
 * data: 2023/1/31
 */
public class test21 {
    public static void main(String[] args) {
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);

        //创建单链表
        node1.next = node2;
        node2.next = node3;


        ListNode node = new ListNode(5);
        ListNode node7 = new ListNode(6);
        ListNode node8 = new ListNode(6);
        node.next = node7;
        node7.next = node8;
        mergeTwoLists(node1, node);
    }

    //迭代
    public static ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode preHead = new ListNode(-1);
        ListNode preNode = preHead;
        while (list1 != null && list2 != null) {
            //判断 l1 和 l2 哪一个链表的头节点的值更小，将较小值的节点添加到结果里
            if (list1.val <= list2.val) {
                //当一个节点被添加到结果里之后，将对应链表中的节点向后移一位。
                preNode.next = list1;
                list1 = list1.next;
            } else {
                preNode.next = list2;
                list2 = list2.next;
            }
            //不管我们将哪一个元素接在了后面，我们都需要把 preNode 向后移一位移动到当前位置。
            preNode = preNode.next;
        }
        // 在循环终止的时候， l1 和 l2 至多有一个是非空的。
        // 由于输入的两个链表都是有序的，所以不管哪个链表是非空的，它包含的所有元素都比前面已经合并链表中的所有元素都要大。
        // 这意味着我们只需要简单地将非空链表接在合并链表的后面，并返回合并链表即可。
        // 合并后 l1 和 l2 最多只有一个还未被合并完，我们直接将链表末尾指向未合并完的链表即可
        preNode.next = list1 == null ? list2 : list1;
        return preHead.next;
    }
}
